FusedBatchNorm

对输入张量执行融合批归一化(Fused Batch Normalization),在多核间拆分批量单元并行完成归一化与仿射变换。

\[\hat{x}_{b,c} = \frac{x_{b,c} - mean_c}{\sqrt{variance_c + \epsilon}}, \quad y_{b,c} = scale_c \cdot \hat{x}_{b,c} + offset_c\]
输入:
  • input - 输入张量首地址,形状为 [unit, channel]

  • scale - 缩放系数数组首地址,长度为 channel

  • offset - 平移系数数组首地址,长度为 channel

  • mean - 归一化均值数组首地址,长度为 channel

  • variance - 归一化方差数组首地址,长度为 channel

  • parameters - 参数结构体首地址,布局如下:

    • parameters[0]: epsilon,数值稳定项(float/float16)

    • parameters[1]: channel,通道数(int)

    • parameters[2]: unit,归一化单元数量(批量大小 × 高 × 宽)(int)

  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

输出:
  • output - 融合批归一化计算结果的张量首地址。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 fp32 数据类型。

  • MT7004 支持 fp16、fp32 数据类型。

共享存储版本:

void fp_fused_batch_norm_s(float *input, float *scale, float *offset, float *mean, float *variance, float *output, void *parameters, int core_mask)
void hp_fused_batch_norm_s(float16 *input, float16 *scale, float16 *offset, float16 *mean, float16 *variance, float16 *output, void *parameters, int core_mask)

C调用示例:

 1// MT7004 示例(共享存储多核,DDR 地址)
 2#include <stdio.h>
 3
 4int main(void) {
 5    float *input = (float *)0x81000000;
 6    float *scale = (float *)0x81020000;
 7    float *offset = (float *)0x81021000;
 8    float *mean = (float *)0x81022000;
 9    float *variance = (float *)0x81023000;
10    float *output = (float *)0x81024000;
11    void *parameters = (void *)0x81050000;
12
13    *(float *)parameters = 1e-5f;            // epsilon
14    int *int_params = (int *)((char *)parameters + 4);
15    int_params[0] = 64;                       // channel
16    int_params[1] = 1024;                     // unit
17
18    int core_mask = 0xff;
19    fp_fused_batch_norm_s(input, scale, offset, mean, variance,
20                          output, parameters, core_mask);
21    return 0;
22}

私有存储版本:

void fp_fused_batch_norm_p(float *input, float *scale, float *offset, float *mean, float *variance, float *output, void *parameters)
void hp_fused_batch_norm_p(float16 *input, float16 *scale, float16 *offset, float16 *mean, float16 *variance, float16 *output, void *parameters)

C调用示例:

 1// MT7004 示例(私有存储单核,AM 地址)
 2#include <stdio.h>
 3
 4int main(void) {
 5    float16 *input = (float16 *)0x10000000;
 6    float16 *scale = (float16 *)0x10020000;
 7    float16 *offset = (float16 *)0x10021000;
 8    float16 *mean = (float16 *)0x10022000;
 9    float16 *variance = (float16 *)0x10023000;
10    float16 *output = (float16 *)0x10024000;
11    void *parameters = (void *)0x10050000;
12
13    *(float16 *)parameters = float32_to_float16(1e-4f);  // epsilon
14    int *int_params = (int *)((char *)parameters + 4);
15    int_params[0] = 32;                                  // channel
16    int_params[1] = 512;                                 // unit
17
18    hp_fused_batch_norm_p(input, scale, offset, mean, variance,
19                          output, parameters);
20    return 0;
21}